AWS CDK で Amazon Cognito の User pool app clients のデフォルトのリダイレクト URI が設定可能になりました
こんにちは、製造ビジネステクノロジー部の若槻です。
少し前の AWS CDK のアップデートで、Amazon Cognito の User pool app clients のデフォルトのリダイレクト URI が設定可能になっていました。
デフォルトのリダイレクト URI 機能自体は Amazon Cognito がリリースされた当初からあった機能のようですが、今回ようやく CDK で設定可能になったようです。
今回、AWS CDK で Amazon Cognito の User pool app clients のデフォルトのリダイレクト URI を設定しつつ、その機能の挙動を改めて確認してみました。
やってみた
未設定の場合の挙動
まず比較のために、デフォルトのリダイレクト URI を設定しない場合の挙動を確認してみます。
AWS CDK で User pool app clients を作成します。
// デフォルトのリダイレクト URI を設定しない場合
import { aws_cognito, Stack } from 'aws-cdk-lib';
import { Construct } from 'constructs';
export class CdkSampleStack extends Stack {
constructor(scope: Construct, id: string) {
super(scope, id);
const userPool = new aws_cognito.UserPool(this, 'UserPool', {
selfSignUpEnabled: true,
signInAliases: { email: true },
});
userPool.addClient('UserPoolClient', {
generateSecret: false,
oAuth: {
callbackUrls: [
'https://dev.classmethod.jp/',
'https://classmethod.jp/',
],
flows: { authorizationCodeGrant: true },
scopes: [
aws_cognito.OAuthScope.EMAIL,
aws_cognito.OAuthScope.PROFILE,
aws_cognito.OAuthScope.OPENID,
],
},
});
userPool.addDomain('UserPoolDomain', {
cognitoDomain: { domainPrefix: '20240816-cm-wakatsuki' },
});
}
}
コールバック URL には次の 2 つを指定しています。
上記を CDK デプロイし、マネジメントコンソールから app clients の Hosted UI を開いてみます。
Hosted UI のリンクでは redirect_uri
パラメーターに https://classmethod.jp/
が指定されているため、認証が成功するとそのページにリダイレクトされます。
一方で、次のように redirect_uri
パラメーターを指定せずに Hosted UI を開いてみます。
するとエラーとなりました。redirect_uri
パラメーターを指定しない場合はリダイレクトできない挙動となるようです。
An error was encountered with the requested page.
デフォルトのリダイレクト URI を設定してみる
先程の挙動が、デフォルトのリダイレクト URI を設定することでどう変わるのか確認してみます。
addClient
メソッドの oAuth.defaultRedirectUri
でデフォルトのリダイレクト URI を設定します。
// デフォルトのリダイレクト URI を設定した場合
import { aws_cognito, Stack } from 'aws-cdk-lib';
import { Construct } from 'constructs';
export class CdkSampleStack extends Stack {
constructor(scope: Construct, id: string) {
super(scope, id);
const userPool = new aws_cognito.UserPool(this, 'UserPool', {
selfSignUpEnabled: true,
signInAliases: { email: true },
});
userPool.addClient('UserPoolClient', {
generateSecret: false,
oAuth: {
callbackUrls: [
'https://dev.classmethod.jp/',
'https://classmethod.jp/',
],
/**
* デフォルトのリダイレクト URI の指定
*/
defaultRedirectUri: 'https://dev.classmethod.jp/',
flows: { authorizationCodeGrant: true },
scopes: [
aws_cognito.OAuthScope.EMAIL,
aws_cognito.OAuthScope.PROFILE,
aws_cognito.OAuthScope.OPENID,
],
},
});
userPool.addDomain('UserPoolDomain', {
cognitoDomain: { domainPrefix: '20240816-cm-wakatsuki' },
});
}
}
ここで設定した URI は下記です。コールバック URLs のうちの一つですが、先ほど確認した未設定の場合の Hosted UI のリンクで redirect_uri
パラメーターに既定で指定されていなかった方の URL となります。
上記を CDK デプロイし、redirect_uri
パラメーターを指定せずに Hosted UI を開いてみます。
すると今度はデフォルトのリダイレクト URI で指定したページにリダイレクトされました。
もちろん、デフォルトでないコールバック URL(https://classmethod.jp/)を指定した場合は、その URL にリダイレクトされる挙動となりました。
ちなみにマネジメントコンソールから app clients の Hosted UI のリンクを確認してみると、こちらも redirect_uri
パラメーターが https://dev.classmethod.jp/
となっていました。
defaultRedirectUri に不正な URI を指定してみる
不正な形式の URI の場合
次のように不正な形式の URI を指定してみます。
userPool.addClient('UserPoolClient', {
generateSecret: false,
oAuth: {
callbackUrls: ['https://dev.classmethod.jp/', 'https://classmethod.jp/'],
/**
* デフォルトのリダイレクト URI の指定
*/
defaultRedirectUri: 'ほげほげ', // 不正な形式の URI
flows: { authorizationCodeGrant: true },
scopes: [
aws_cognito.OAuthScope.EMAIL,
aws_cognito.OAuthScope.PROFILE,
aws_cognito.OAuthScope.OPENID,
],
},
});
CDK Synth をすると Error: defaultRedirectUri must be included in callbackUrls.
というエラーとなりました。
callbackUrls に含まれない URL の場合
次のように callbackUrls に含まれない URL を指定してみます。
userPool.addClient('UserPoolClient', {
generateSecret: false,
oAuth: {
callbackUrls: ['https://dev.classmethod.jp/', 'https://classmethod.jp/'],
/**
* デフォルトのリダイレクト URI の指定
*/
defaultRedirectUri: 'https://example.com/', // callbackUrls に含まれない URL
flows: { authorizationCodeGrant: true },
scopes: [
aws_cognito.OAuthScope.EMAIL,
aws_cognito.OAuthScope.PROFILE,
aws_cognito.OAuthScope.OPENID,
],
},
});
CDK Synth をすると Error: defaultRedirectUri must be included in callbackUrls.
というエラーとなりました。
指定する URI のバリデーションは CDK の合成時にちゃんと行われるようです。
おわりに
AWS CDK で Amazon Cognito の User pool app clients のデフォルトのリダイレクト URI が設定可能になっていたので共有しました。
認証リクエストに redirect_uri
パラメーターが含まれていない場合でもユーザーにエラーを表示させない、という利点はあるため設定しておくと良いのではないでしょうか。
以上